//顺序表 队列

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>

#define TYPE int

typedef struct Queue
{
	TYPE* base;	
	int size;	//容量
	int head;	//队头
	int tall;	//队尾
	int cnt;	//数量
}Queue;

//创建
Queue* creat_queue(int len);
//销毁
void destory_queue(Queue* queue);
//队空
bool empty_queue(Queue* queue);
//队满
bool full_queue(Queue* queue);
//入队
bool push_queue(Queue* queue,TYPE data);
//出队
bool pop_queue(Queue* queue);
//查看队头
TYPE* head_queue(Queue* queue);
//查看队尾
TYPE* tall_queue(Queue* queue);






int main()
{
	Queue* queue=creat_queue(10);
	printf("开始入队:\n------------\n");
	for(int i=0;i<10;i++)
	{
		printf("入队%s,",push_queue(queue,i)?"成功":"失败");
		printf("队尾:%d\n",*tall_queue(queue));
	}
	printf("开始出队:\n-------------\n");
	for(int i=0;i<5;i++)
	{
		printf("出队:%s,",pop_queue(queue)?"成功":"失败");
		printf("队尾:%d\n",*tall_queue(queue));
		
	}
	printf("开始入队:\n--------------\n");
	for(int i=0;i<10;i++)
	{
		printf("入队%s,",push_queue(queue,i)?"成功":"失败");
		printf("队尾:%d\n",*tall_queue(queue));
	}



}


//创建
Queue* creat_queue(int len)
{
	Queue* queue = malloc(sizeof(Queue));
	queue->base = malloc(sizeof(TYPE)* len);
	queue->size = len;
	queue->head = 0;
	queue->tall = -1;
	queue->cnt = 0;
	return queue;
}
//销毁
void destory_queue(Queue* queue)
{
	free(queue->base);
	free(queue);
}
//队空
bool empty_queue(Queue* queue)
{

	return !queue->cnt;
}
//队满
bool full_queue(Queue* queue)
{
	return 	queue->cnt >= queue->size;	
}	
//入队
bool push_queue(Queue* queue,TYPE data)
{
	//顺序表队列 判断队满
	if(full_queue(queue)) return false;
	//回头
	queue->tall =(queue->tall+1) % queue->size;
	queue->base[queue->tall]=data;
	queue->cnt++;
	return true;

}
//出队
bool pop_queue(Queue* queue)
{
	//判断队空
	if(empty_queue(queue))	return false;
 	//回头
	queue->head = (queue->head+1) % queue->size;
	queue->cnt --;
	return true;
}
//查看队头
TYPE* head_queue(Queue* queue)
{
	if(empty_queue(queue))return NULL;
	return queue->base +queue->head;
}
//查看队尾
TYPE* tall_queue(Queue* queue)
{
	if(empty_queue(queue))return NULL;
	return queue->base + queue->tall;
}



